// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraNumberPopComponent_NiagaraText.h"

#include "Feedback/NumberPops/LyraNumberPopComponent.h"
#include "LyraDamagePopStyleNiagara.h"
#include "LyraLogChannels.h"
#include "NiagaraComponent.h"
#include "NiagaraDataInterfaceArrayFunctionLibrary.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraNumberPopComponent_NiagaraText)

/**
 * 构造函数
 */
ULyraNumberPopComponent_NiagaraText::ULyraNumberPopComponent_NiagaraText(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{


}

/**
 * 添加数字弹出效果
 */
void ULyraNumberPopComponent_NiagaraText::AddNumberPop(const FLyraNumberPopRequest& NewRequest)
{
	int32 LocalDamage = NewRequest.NumberToDisplay; // 本地伤害数字

	//Change Damage to negative to differentiate Critial vs Normal hit
	// 将伤害改为负数以区分暴击与普通命中
	if (NewRequest.bIsCriticalDamage)
	{
		LocalDamage *= -1; // 如果是暴击，乘以-1
	}

	//Add a NiagaraComponent if we don't already have one
	// 如果我们还没有 NiagaraComponent，则添加一个
	if (!NiagaraComp)
	{
		NiagaraComp = NewObject<UNiagaraComponent>(GetOwner()); // 创建新的 Niagara 组件
		if (Style != nullptr)
		{
			NiagaraComp->SetAsset(Style->TextNiagara); // 设置 Niagara 系统资产
			NiagaraComp->bAutoActivate = false; // 设置自动激活为 false
			
		}
		NiagaraComp->SetupAttachment(nullptr); // 设置附件为 null
		check(NiagaraComp);
		NiagaraComp->RegisterComponent(); // 注册组件
	}


	NiagaraComp->Activate(false); // 激活组件
	NiagaraComp->SetWorldLocation(NewRequest.WorldLocation); // 设置世界位置

	UE_LOG(LogLyra, Log, TEXT("DamageHit location : %s"), *(NewRequest.WorldLocation.ToString())); // 日志输出伤害命中位置
	//Add Damage information to the current Niagara list - Damage informations are packed inside a FVector4 where XYZ = Position, W = Damage
	// 添加伤害信息到当前 Niagara 列表 - 伤害信息被打包在 FVector4 中，其中 XYZ = 位置, W = 伤害
	TArray<FVector4> DamageList = UNiagaraDataInterfaceArrayFunctionLibrary::GetNiagaraArrayVector4(NiagaraComp, Style->NiagaraArrayName); // 获取 Niagara 数组 Vector4
	DamageList.Add(FVector4(NewRequest.WorldLocation.X, NewRequest.WorldLocation.Y, NewRequest.WorldLocation.Z, LocalDamage)); // 添加新的伤害信息
	UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector4(NiagaraComp, Style->NiagaraArrayName, DamageList); // 设置 Niagara 数组 Vector4
	
}